package main

import (
	"bytes"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/pflag"
	"github.com/spf13/viper"
	_ "github.com/spf13/viper/remote" // 匿名引入包
	"go.uber.org/zap"
	"log"
)

//	func main() {
//		cmdable := ioc.InitRedis()
//		v := ioc.InitGinMiddlewares(cmdable)
//		db := ioc.InitDB()
//		userDAO := dao.NewUserDAO(db)
//		userCache := cache.NewUserCache(cmdable)
//		userRepository := repository.NewUserRepository(userDAO, userCache)
//		userService := service.NewUserService(userRepository)
//		codeCache := cache.NewCodeCache(cmdable)
//		codeRepository := repository.NewCodeRepository(codeCache)
//		smsService := ioc.InitSMSService()
//		codeService := service.NewCodeService(codeRepository, smsService)
//		userHandler := web.NewUserHandler(userService, codeService)
//		server := ioc.InitWebServer(v, userHandler)
//		server.Run(":8080")
//	}
func main() {
	//initViper()
	//initViperWithReader()
	initViperWithFlag()
	initLogger()
	//initViperRemote()
	//initViperWatchLocalFile()
	//initViperWatchRemote()
	server := InitWebServer() // 使用wire生成的InitWebServer代码
	server.Run(":8080")
}

func initViper() {
	viper.SetConfigName("dev")
	viper.SetConfigType("yaml")
	// 当前工作目录的 config 子目录
	viper.AddConfigPath("config")
	// 读取配置
	err := viper.ReadInConfig()
	if err != nil {
		panic(err)
	}
	val := viper.Get("test.key")
	log.Println(val)
}

func initViperWithReader() {
	cfg := `
test:
  key: value1

redis:
  addr: "localhost:6379"

db:
  dsn: "root:12345678@tcp(localhost:3306)/webook"
`
	viper.SetConfigType("yaml")
	err := viper.ReadConfig(bytes.NewReader([]byte(cfg)))
	if err != nil {
		panic(err)
	}
}

// 启动参数添加 --config=config/dev.yaml

func initViperWithFlag() {
	cfile := pflag.String("config",
		"config/config.yaml", "配置文件路径")
	// 这一步之后，cfile 里面才有值
	pflag.Parse()
	//viper.Set("db.dsn", "localhost:3306")
	// 所有的默认值放好s
	viper.SetConfigType("yaml")
	viper.SetConfigFile(*cfile)
	// 读取配置
	err := viper.ReadInConfig()
	if err != nil {
		panic(err)
	}
	val := viper.Get("test.key")
	log.Println(val)
}

// 事先上传配置到etcd etcdctl --endpoints=127.0.0.1:2379 put /webook "$(<dev.yaml)"
// etcdctl --endpoints=127.0.0.1:2379  get  /webook

func initViperRemote() {
	err := viper.AddRemoteProvider("etcd3",
		"http://10.211.55.8:2379", "/webook")
	if err != nil {
		panic(err)
	}
	viper.SetConfigType("yaml")
	err = viper.ReadRemoteConfig()
	if err != nil {
		panic(err)
	}
}

func initViperWatchLocalFile() {
	cfile := pflag.String("config",
		"config/config.yaml", "配置文件路径")
	// 这一步之后，cfile 里面才有值
	pflag.Parse()
	//viper.Set("db.dsn", "localhost:3306")
	// 所有的默认值放好s
	viper.SetConfigType("yaml")
	viper.SetConfigFile(*cfile)
	viper.WatchConfig()
	viper.OnConfigChange(func(in fsnotify.Event) {
		log.Println(viper.GetString("test.key"))
	})
	// 读取配置
	err := viper.ReadInConfig()
	if err != nil {
		panic(err)
	}
	val := viper.Get("test.key")
	log.Println(val)
}

// 修改后再次上传到etcd 测试触发 etcdctl --endpoints=127.0.0.1:2379 put /webook "$(<dev.yaml)"
func initViperWatchRemote() {
	err := viper.AddRemoteProvider("etcd3",
		"http://10.211.55.8:2379", "/webook")
	if err != nil {
		panic(err)
	}
	viper.SetConfigType("yaml")
	viper.OnConfigChange(func(in fsnotify.Event) {
		log.Println("远程配置中心发生变更")
	})
	go func() { // 并发安全
		for {
			err = viper.WatchRemoteConfig()
			if err != nil {
				panic(err)
			}
			log.Println("watch", viper.GetString("test.key"))
			//time.Sleep(time.Second)
		}
	}()
	err = viper.ReadRemoteConfig()
	if err != nil {
		panic(err)
	}
}

func initLogger() {
	logger, err := zap.NewDevelopment()
	if err != nil {
		panic(err)
	}
	zap.ReplaceGlobals(logger)
}
